#include "home.h"
#include "ui_home.h"
#include "msgwidget.h"
#include "customwidget.h"
#include "config.h"
#include "chatfriend.h"
#include <QDir>
#include <QFile>
#include <QTextStream>
#include <cstdio>
/***主页面，包含左侧List*****/
Home::Home(QString user, QTcpSocket *s, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Home)
{
    ui->setupUi(this);
    ui->listWidget->setStyleSheet(
        "QListWidget {background-color: rgb(246, 245, 244);}"
        "QListWidget::item:hover {background-color: rgb(135, 206, 250);}"
    );


    username = user;
    socket = s;
    ui->label_username->setText(username);

    // 1.获取个人用户头像
    QString type1 = "GET_IMG";
    QDataStream stream1(socket);
    stream1 << type1 << username;
    bool response1;
    if (socket->waitForReadyRead()) {
        stream1 >> response1;
        qDebug() << "row 23 response1 is " << response1;
        if (response1) {
            QByteArray imageData; // 包含二进制图像数据的字节数组
            stream1 >> imageData;
            // 假设您已经将图像数据读取到 imageData 中
            _userimg = imageData;
            QPixmap pixmap;
            pixmap.loadFromData(imageData); // 从字节数组加载图像数据为 QPixmap
            _usericon = pixmap;
            if (!pixmap.isNull()) {
                // 成功加载图像数据
                QSize labelSize = ui->label_user->size();
                // 调整图像大小以适应 QLabel 容器
                QPixmap scaledPixmap = pixmap.scaled(labelSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
                ui->label_user->setPixmap(scaledPixmap); // 将 QPixmap 设置为 QLabel 的图像
            } else {
                qDebug() << "Failed to load image from byte array.";
            }
        }
    }

    // 2.获取消息列表
    // 初始化list，先发送消息给服务器，获得当前username的所有群组（消息），建立对应List的内容
    QString type = "GET_GROUP";
    QDataStream stream(socket);
    stream << type;
    bool response;
    QString groupName;
    QByteArray groupimg;
    if (socket->waitForReadyRead()) {
        stream >> response;
        if (response) {
            while(1) { // 死循环不停接收群组的名字，接收到DONE消息后再break退出
                stream >> groupName;
                if (groupName == "DONE") { //结束消息这里也直接用groupName接收
                    break;
                }
                /***
//                // 普通的添加listItem，最成功的一集
//                QListWidgetItem* newItem = new QListWidgetItem(groupName);
//                newItem->setSizeHint(QSize(200, 70));

//                QFont font;
//                font.setPointSize(17);
//                newItem->setFont(font);
//                ui->listWidget->addItem(newItem);
                ****/

                // 添加WidgetItem，需要重写触发函数，并且点击还不变色
                // 创建QWidget对象并且设置其布局
                QListWidgetItem *item = new QListWidgetItem();
                QVariant groupValue("GROUP");
                item->setData(Qt::UserRole, groupValue);  // 设置属性
                CustomWidget *itemWidget = new CustomWidget(item);
//                itemWidget->setFixedHeight(70);
                QHBoxLayout *layout = new QHBoxLayout(itemWidget);
                itemWidget->setLayout(layout);

                // 添加头像和组名标签
                stream >> groupimg;
                QLabel *label = new QLabel(groupName, itemWidget);
                QLabel *avatorLabel = new QLabel(itemWidget);
                avatorLabel->setFixedSize(50, 50);
                avatorLabel->setObjectName("groupIcon");

                QPixmap pixmap;
                pixmap.loadFromData(groupimg); // 从字节数组加载图像数据为 QPixmap
                if (!pixmap.isNull()) {
                    // 成功加载图像数据
                    QSize labelSize = avatorLabel->size();
                    // 调整图像大小以适应 QLabel 容器
                    QPixmap scaledPixmap = pixmap.scaled(labelSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
                    avatorLabel->setPixmap(scaledPixmap); // 将 QPixmap 设置为 QLabel 的图像
                } else {
                    qDebug() << "Failed to load image from byte array.";
                }

                label->setObjectName("groupName");  // 设置 label 的 objectName
                label->setAttribute(Qt::WA_TranslucentBackground); // 设置为透明背景
                label->setStyleSheet("background-color: transparent;"); // 设置为透明样式
//                avatorLabel->setAttribute(Qt::WA_TranslucentBackground); // 设置为透明背景
//                avatorLabel->setStyleSheet("background-color: transparent;"); // 设置为透明样式
                layout->addWidget(avatorLabel);
                layout->addWidget(label);

                // 将QWidget对象放到ListWidget中
                QListWidget *listWidget = ui->listWidget; // 假设已经存在一个 QListWidget 实例
                item->setSizeHint(QSize(200, 70)); // 将item的高度设置为70在
//                item->setSizeHint(itemWidget->sizeHint());
                listWidget->addItem(item);
                listWidget->setItemWidget(item, itemWidget);

            }

        }
    }

    //  2.2获取好友列表
    QString action = "GET_FRIEND";
    stream << action;
    QString friendName;
    QByteArray friendImg;
    response = false;
    if (socket->waitForReadyRead()) {
        stream >> response;
        if (response) {
            while(1) { // 死循环不停接收好友的名字，接收到DONE消息后再break退出
                stream >> friendName;
                if (friendName == "DONE") { //结束消息这里也直接用groupName接收
                    break;
                }
                // 添加WidgetItem，需要重写触发函数，并且点击还不变色
                // 创建QWidget对象并且设置其布局
                QListWidgetItem *item = new QListWidgetItem();
                QVariant friendValue("FRIEND");
                item->setData(Qt::UserRole, friendValue);  // 设置属性
                CustomWidget *itemWidget = new CustomWidget(item);
//                itemWidget->setFixedHeight(70);
                QHBoxLayout *layout = new QHBoxLayout(itemWidget);
                itemWidget->setLayout(layout);

                // 添加头像和组名标签
                stream >> friendImg;
                QLabel *label = new QLabel(friendName, itemWidget);
                QLabel *avatorLabel = new QLabel(itemWidget);
                avatorLabel->setFixedSize(50, 50);
                avatorLabel->setObjectName("groupIcon");

                QPixmap pixmap;
                pixmap.loadFromData(friendImg); // 从字节数组加载图像数据为 QPixmap
                if (!pixmap.isNull()) {
                    // 成功加载图像数据
                    QSize labelSize = avatorLabel->size();
                    // 调整图像大小以适应 QLabel 容器
                    QPixmap scaledPixmap = pixmap.scaled(labelSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
                    avatorLabel->setPixmap(scaledPixmap); // 将 QPixmap 设置为 QLabel 的图像
                } else {
                    qDebug() << "Failed to load image from byte array.";
                }

                label->setObjectName("groupName");  // 设置 label 的 objectName
                label->setAttribute(Qt::WA_TranslucentBackground); // 设置为透明背景
                label->setStyleSheet("background-color: transparent;"); // 设置为透明样式
//                avatorLabel->setAttribute(Qt::WA_TranslucentBackground); // 设置为透明背景
//                avatorLabel->setStyleSheet("background-color: transparent;"); // 设置为透明样式
                layout->addWidget(avatorLabel);
                layout->addWidget(label);

                // 将QWidget对象放到ListWidget中
                QListWidget *listWidget = ui->listWidget; // 假设已经存在一个 QListWidget 实例
                item->setSizeHint(QSize(200, 70)); // 将item的高度设置为70在
//                item->setSizeHint(itemWidget->sizeHint());
                listWidget->addItem(item);
                listWidget->setItemWidget(item, itemWidget);

            }

        }
    }


/********************************************************/
    // 3.生成stackedPage
    // 遍历所有List, 生成对应的Stackedpage。新版
    QListWidget* listWidget = ui->listWidget; // 假设已经存在一个 QListWidget 实例
    int itemCount = listWidget->count();
    for (int i = 0; i < itemCount; ++i) {
        QListWidgetItem* item = listWidget->item(i);
        // 获取属性值
        QVariant propertyValue = item->data(Qt::UserRole);
        QString property = propertyValue.toString();
        CustomWidget* itemWidget = dynamic_cast<CustomWidget*>(listWidget->itemWidget(item));
        if (itemWidget) {
            QLabel* label = itemWidget->findChild<QLabel*>("groupName");
            if (label) {
                QString chatW = label->text();
                // 在这里处理获取到的文字消息，例如打印或使用
                qDebug() << "row 92 chatW Text: " << chatW;
                if(property == "GROUP"){
                    ChatGroup *cg = new ChatGroup(socket, username, chatW, _userimg, _usericon);
                    connect(cg, &ChatGroup::stopRecv, this, [=]() {
                        disconnect(socket, &QTcpSocket::readyRead, this, &Home::recvMsg);
                        qDebug() << "row 212 recvMsg is stop";
                    },  Qt::DirectConnection);

                    connect(cg, &ChatGroup::reStartRecv, this, [=]() {
                        connect(socket, &QTcpSocket::readyRead, this, &Home::recvMsg);
                        qDebug() << "row 216 recvMsg is restart";
                    },  Qt::DirectConnection);
                    ui->stackedWidget->addWidget(cg);
                } else if (property == "FRIEND") {
                    ChatFriend *cf = new ChatFriend(socket, username, chatW, _userimg, _usericon);
                    ui->stackedWidget->addWidget(cf);
                }

            } else {
                qDebug() << "row 99 not find label";
            }
        } else {
            qDebug() << "row 99 not find widget";
        }
    }

    // 4.跳转
    // 选中listItem跳转到对应stackedPage
    ui->listWidget->clearSelection(); // 确保没有选中项
    connect(ui->listWidget, &QListWidget::itemClicked, this, [this](QListWidgetItem* current) {
//        QListWidget *listWidget = qobject_cast<QListWidget *>(sender());
        int index = ui->listWidget->row(current);
        qDebug() << index;
        if (current) {
            current->setSelected(true);
            ui->listWidget->setCurrentItem(current);

//            qDebug() << "选中单元：" << current->text();
            int indexOfList = ui->listWidget->row(current);
            ui->stackedWidget->setCurrentIndex(indexOfList + 2);
        }
    });

    connect(socket, &QTcpSocket::readyRead, this, &Home::recvMsg, Qt::DirectConnection);


}

Home::~Home()
{
    delete ui;
}

void Home::handleLabelClicked() {
    qDebug() << "Label clicked!";
    // 在这里执行点击事件的逻辑
}

void Home::on_pushButton_3_clicked() //设置按钮，换头像
{
    Config *c = new Config(socket, username);
    connect(c, &Config::updateImg, [this](QByteArray imageData) { //设在好新头像后这里展示的也得变化
        // 接收到信号后，更改图片
        // 假设您已经将图像数据读取到 imageData 中
        _userimg = imageData;
        QPixmap pixmap;
        pixmap.loadFromData(imageData); // 从字节数组加载图像数据为 QPixmap
        _usericon = pixmap;
        if (!pixmap.isNull()) {
            // 成功加载图像数据
            QSize labelSize = ui->label_user->size();
            // 调整图像大小以适应 QLabel 容器
            QPixmap scaledPixmap = pixmap.scaled(labelSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
            ui->label_user->setPixmap(scaledPixmap); // 将 QPixmap 设置为 QLabel 的图像
        } else {
            qDebug() << "Failed to load image from byte array.";
        }
    });
    c->show();
}

void Home::recvMsg()
{
    QDataStream stream(socket);
    QString action;
    QString whoSend;
    QByteArray whoSendImg;
    stream >> action;
    qDebug() << "295 in home, action is " << action;
    if (action == "GROUP_MSG") {
        QString groupname;
        QString msg;
        stream >> groupname >> msg;
        stream >> whoSend >> whoSendImg;
        qDebug() << "row 218 get msg is " << msg;

        // 遍历list查找groupname
        QListWidget* listWidget = ui->listWidget; // 假设已经存在一个 QListWidget 实例
        int itemCount = listWidget->count();
        for (int i = 0; i < itemCount; ++i) {
            QListWidgetItem* item = listWidget->item(i);
            CustomWidget* itemWidget = dynamic_cast<CustomWidget*>(listWidget->itemWidget(item));
            if (itemWidget) {
                QLabel* label = itemWidget->findChild<QLabel*>("groupName");
                if (label->text() == groupname) {
                    // 在这里处理获取到的文字消息，例如打印或使用
                    qDebug() << "row 239 chatW Text: " << groupname;
                    // 获得chatGroup对象
                    ChatGroup* chatGroup = qobject_cast<ChatGroup*>(ui->stackedWidget->widget(i + 2));
                    if (chatGroup) {
                        // 调用chatGroup的共有函数，向聊天框中加入msg
                       chatGroup->getMsg(whoSend, whoSendImg, msg);

                    } else {
                        qDebug() << "row 247 获取chatGroup失败";
                    }

                } else {
                    qDebug() << "row 246 not find label";
                }
            } else {
                qDebug() << "row 249 not find widget";
            }
        }
    } else if (action == "FRIEND_MSG") {
        QString whoGet;
        QString msg;
        stream >> whoGet >> msg;
        stream >> whoSend >> whoSendImg;
        qDebug() << "row 326 get msg is " << msg;

        // 遍历list查找groupname
        QListWidget* listWidget = ui->listWidget; // 假设已经存在一个 QListWidget 实例
        int itemCount = listWidget->count();
        for (int i = 0; i < itemCount; ++i) {
            QListWidgetItem* item = listWidget->item(i);
            CustomWidget* itemWidget = dynamic_cast<CustomWidget*>(listWidget->itemWidget(item));
            if (itemWidget) {
                QLabel* label = itemWidget->findChild<QLabel*>("groupName");
                if (label->text() == whoSend) {
                    // 在这里处理获取到的文字消息，例如打印或使用
                    qDebug() << "row 239 chatW Text: " << whoSend;
                    // 获得chatGroup对象
                    ChatFriend* chatFriend = qobject_cast<ChatFriend*>(ui->stackedWidget->widget(i + 2));
                    if (chatFriend) {
                        // 调用chatFriend的公有函数，向聊天框中加入msg
                       chatFriend->getMsg(whoSend, whoSendImg, msg);

                    } else {
                        qDebug() << "row 346 获取chatGroup失败";
                    }

                } else {
                    qDebug() << "row 350 not find label";
                }
            } else {
                qDebug() << "row 353 not find widget";
            }
        }

    } else if (action == "RESPONSE") {
        bool response;
        stream >> response;
        if (response) {
            qDebug() << "发送成功， 对方在线";
            qDebug() << "row 359 response is " << response;
        } else {
            qDebug() << "发送失败， 对方不在线";
            qDebug() << "row 363 response is " << response;
        }
    } else if (action == "ISINHIBIT") {
        bool isInhibit;
        stream >>  isInhibit;
        if (isInhibit) {
            QMessageBox::warning(nullptr, "禁言提示", "您已被禁言");
        }
    } else if (action == "FRIEND_FILE") {
        QByteArray fileArray;
        QString fileName;
        quint32 fileSize;
        stream >> fileName;
        stream >> fileSize;
        fileArray.resize(fileSize);
        stream.readRawData(fileArray.data(), fileSize);
//        fileArray = socket->readAll();
        qDebug() << "row 390, get fileArray size is " << fileArray.size();

        int result = QMessageBox::question(this, "接收文件", "是否接收该文件？", QMessageBox::Yes | QMessageBox::No);
        if (result == QMessageBox::Yes) {
            QString folderPath = "./file";  // 替换为你要创建文件夹的路径
            QString filePath = folderPath + "/" + fileName;  // 替换为你要保存文件的路径
            qDebug() << "row 395, filePath is " << filePath;
            QDir dir;
            if (dir.mkpath(folderPath)) {
                // 文件夹创建成功
                QFile file(filePath);
                if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
                    qint64 bytesWritten = file.write(fileArray);
                    file.close();
                    if (bytesWritten == fileArray.size()) {
                        // 文件写入成功
                        QMessageBox::information(this, "成功", "文件已成功保存。");
                    } else {
                        QMessageBox::critical(this, "错误", "写入文件时发生错误。");
                    }
                } else {
                    QMessageBox::critical(this, "错误", "无法打开文件进行写入。");
                }
/***
                // 文件夹创建成功
                FILE* file = fopen(filePath.toStdString().c_str(), "wb");
                if (file != nullptr) {
                    size_t bytesWritten = fwrite(fileArray.constData(), 1, fileArray.size(), file);
                    fclose(file);
                    if (bytesWritten == static_cast<size_t>(fileArray.size())) {
                        // 文件写入成功
                        QMessageBox::information(this, "成功", "文件已成功保存。");
                    } else {
                        QMessageBox::critical(this, "错误", "写入文件时发生错误。");
                    }
                } else {
                    QMessageBox::critical(this, "错误", "无法打开文件进行写入。");
                }
                ***/
            } else {
                // 文件夹创建失败
                QMessageBox::critical(this, "错误", "无法创建文件夹。");
            }
        } else {
            // 用户选择取消，不执行任何操作
        }



    }

}
